Composite Builder

객체 하나를 생성하는데, 복수의 빌더가 사용되는 경우
class Person{
//
std::string street_address, post_code, city;
//
std::string company_name, position;
int annual_income=0;
Person() {}
};
위의 클래스에 대하여 4가지 빌더를 정의
PersonBuilderBase와 이를 상속하는
PersonBuilder, PersonAddressBuilder, PersonJobBuilder 클래스
class PersonBuilderBase{
protected:
Person& person; // Base Builder Person , !( )
explicit PersonBuilderBase(Person& person): person(person) {}
public:
operator Person(){
return std::move(person);
}
PersonAddressBuilder lives() const;
PersonJobBuilder works() const; // !
};
// PersonBuilder
class PersonBuilder: public PersonBuilderBase{
Person p;
public:
PersonBuilder(): PersonBuilderBase{p} {}
};
// PersonAddressBuilder
class PersonAddressBuilder: public PersonBuilderBase{
typedef PersonAddressBuilder self;
public:
explicit PersonAddressBuilder(Person& person): PersonBuilderBase{person} {}
self& at(std::string street_address){
person.street_address=street_address;
return *this;
}
self& with_postcode(std::string post_code){
// ...
}
self& in(std::string city){
// ...
}
};
세 개의 Builder 클래스에서 Person private 멤버에 접근할 수 있도록 friend로 선언해야 한다.
//
Person p=Person::build() // builder
.lives().at("123 London Road")
.with_postcode("SW1 1GB")
.in("London") // PersonAddressBuilder
.works().at("PragmaSoft")
.as_a("Consultant")
.earning(10e6); // PersonJobBuilder